/*
 * Created on 2007-11-23
 *
 * TODO
 */
package jacky.lanlan.song.aop;

import jacky.lanlan.song.aop.annotation.Pointcut;
import jacky.lanlan.song.closure.ReturnableHandler;

import java.lang.reflect.Method;

/**
 * 方法过滤器，过滤匹配切入点表达式的方法。
 * 
 * @author Jacky.Song
 */
interface MethodFilter {
	
	/**
	 * 判断给定方法是否匹配指定的切入点表达式
	 * 
	 * @param expression
	 *          切入点表达式
	 * @param method
	 *          给定方法
	 * @return true如果匹配，false if not
	 */
	boolean isMethodMatch(String expression,Method method);
	
	/**
	 * 过滤符合正则表达式语法的Pointcut的表达式的方法
	 */
	public static final MethodFilter regexPointcutFilter=new MethodFilter() {
		public boolean isMethodMatch(String expression, Method method) {
			return method.toGenericString().matches(expression);
		}
	};
	
	/**
	 * 过滤兼容AspectJ语法的Pointcut的表达式的方法
	 */
	public static final MethodFilter aspectJPointcutFilter=new MethodFilter() {
		public boolean isMethodMatch(String expression, Method method) {
			return false;// TODO
		}
	};
	
	/**
	 * 过滤兼容Spring语法的Pointcut的表达式的方法
	 */
	public static final MethodFilter springPointcutFilter=new MethodFilter() {
		public boolean isMethodMatch(String expression, Method method) {
			return false;// TODO
		}
	};
	
	/**
	 * MethodFilter 选择器，自动选择适合该Pointcut的MethodFilter
	 */
	public static final ReturnableHandler<Pointcut,MethodFilter> selectFilter=
		new ReturnableHandler<Pointcut,MethodFilter>() {
			public MethodFilter doWith(Pointcut pointcut) {
				switch(pointcut.type()) {
					case REGEX:
						return regexPointcutFilter;
					case ASPECTJ:
						return aspectJPointcutFilter;
					case SPRING:
						return springPointcutFilter;
				}
				return null;
			}
		};
	
}
